<?php

namespace JingdongApi\Models;

/**
 * 订单数据模型
 * 
 * @package JingdongApi\Models
 */
class OrderData
{
    /**
     * 海博平台订单号（18-45个字符）
     * @var string
     */
    public $orderId;
    
    /**
     * 交易订单来源
     * @var int
     */
    public $tradeOrderSource;
    
    /**
     * 交易订单号
     * @var string
     */
    public $tradeOrderId;
    
    /**
     * 配送商配送服务
     * @var string
     */
    public $serviceCode;
    
    /**
     * 收件人姓名
     * @var string
     */
    public $recipientName;
    
    /**
     * 收件人电话
     * @var string
     */
    public $recipientPhone;
    
    /**
     * 收件人地址
     * @var string
     */
    public $recipientAddress;
    
    /**
     * 收件人经度（火星坐标*10^6）
     * @var int
     */
    public $recipientLng;
    
    /**
     * 收件人纬度（火星坐标*10^6）
     * @var int
     */
    public $recipientLat;
    
    /**
     * 是否即时单（0-即时单；1-预约单）
     * @var int
     */
    public $prebook;
    
    /**
     * 物品重量（单位：g）
     * @var int
     */
    public $totalWeight;
    
    /**
     * 发件人经度（火星坐标*10^6）
     * @var int
     */
    public $senderLng;
    
    /**
     * 发件人纬度（火星坐标*10^6）
     * @var int
     */
    public $senderLat;
    
    /**
     * 发件人姓名
     * @var string
     */
    public $senderName;
    
    /**
     * 发件人电话
     * @var string
     */
    public $senderPhone;
    
    /**
     * 发件人详细地址
     * @var string
     */
    public $senderAddress;
    
    /**
     * 下单姓名
     * @var string
     */
    public $operatorName;
    
    /**
     * 配送商id
     * @var string
     */
    public $carrierMerchantId;
    
    /**
     * 扩展信息
     * @var array
     */
    public $extInfo;
    
    /**
     * 取餐流水号
     * @var string
     */
    public $orderSequence;
    
    /**
     * 询价返回的配送费用
     * @var float
     */
    public $preDeliveryFee;
    
    /**
     * 期望送达时间
     * @var int
     */
    public $expectedDeliveryTime;
    
    /**
     * 预计取货时间
     * @var int
     */
    public $expectedPickupTime;
    
    /**
     * 期望送达时间左区间
     * @var int
     */
    public $expectedLeftDeliveryTime;
    
    /**
     * 期望送达时间右区间
     * @var int
     */
    public $expectedRightDeliveryTime;
    
    /**
     * 是否保价
     * @var int
     */
    public $insuredMark;
    
    /**
     * 货品价值
     * @var float
     */
    public $totalValue;
    
    /**
     * 物品体积
     * @var float
     */
    public $totalVolume;
    
    /**
     * 订单流向
     * @var int
     */
    public $riderPickMethod;
    
    /**
     * 小费金额
     * @var float
     */
    public $tipFee;
    
    /**
     * 物品明细
     * @var array
     */
    public $goodsDetails;
    
    /**
     * 订单备注
     * @var string
     */
    public $orderRemark;
    
    /**
     * 商户备注
     * @var string
     */
    public $shopRemark;
    
    /**
     * 配送商门店id
     * @var string
     */
    public $carrierShopId;
    
    /**
     * 下单人电话
     * @var string
     */
    public $operatorPhone;
    
    /**
     * 汽车配送车型
     * @var string
     */
    public $carModelCode;
    
    /**
     * 指定骑手信息
     * @var string
     */
    public $riderInfo;
    
    /**
     * 商家经营品类
     * @var string
     */
    public $category;
    
    /**
     * 构造函数
     * 
     * @param array $data 订单数据
     */
    public function __construct($data = [])
    {
        foreach ($data as $key => $value) {
            if (property_exists($this, $key)) {
                $this->$key = $value;
            }
        }
    }
    
    /**
     * 转换为数组
     * 
     * @return array
     */
    public function toArray()
    {
        $result = [];
        
        foreach (get_object_vars($this) as $key => $value) {
            if ($value !== null) {
                $result[$key] = $value;
            }
        }
        
        return $result;
    }
    
    /**
     * 验证必填字段
     * 
     * @throws \InvalidArgumentException
     */
    public function validate()
    {
        $required = [
            'orderId' => '订单号',
            'recipientName' => '收件人姓名',
            'recipientPhone' => '收件人电话',
            'recipientAddress' => '收件人地址',
            'recipientLng' => '收件人经度',
            'recipientLat' => '收件人纬度',
            'totalWeight' => '物品重量',
            'senderLng' => '发件人经度',
            'senderLat' => '发件人纬度',
            'senderName' => '发件人姓名',
            'senderPhone' => '发件人电话',
            'senderAddress' => '发件人地址'
        ];
        
        foreach ($required as $field => $desc) {
            if (empty($this->$field)) {
                throw new \InvalidArgumentException($desc . ' 不能为空');
            }
        }
    }
}
